package com.abc.recycling.service;

import com.abc.recycling.domain.statistics.ChartData;
import com.abc.recycling.domain.statistics.RankingData;
import com.abc.recycling.domain.statistics.RegionStatistics;
import com.abc.recycling.domain.statistics.StatisticsOverview;
import com.abc.recycling.model.StatisticsData;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface StatisticsService {
    /**
     * 获取统计概览数据
     * @param timeRange 时间范围：today, week, month, year
     * @return 统计概览数据
     */
    StatisticsOverview getOverview(String timeRange);
    
    /**
     * 获取回收趋势数据
     * @param timeRange 时间范围
     * @return 趋势图数据
     */
    ChartData getTrendData(String timeRange);
    
    /**
     * 获取物品类型分布数据
     * @param timeRange 时间范围
     * @return 分布图数据
     */
    ChartData getTypeDistribution(String timeRange);
    
    /**
     * 获取回收站排行
     * @param timeRange 时间范围
     * @param limit 限制数量
     * @return 回收站排行数据
     */
    List<RankingData.StationRanking> getStationRanking(String timeRange, int limit);
    
    /**
     * 获取回收员排行
     * @param timeRange 时间范围
     * @param limit 限制数量
     * @return 回收员排行数据
     */
    List<RankingData.CollectorRanking> getCollectorRanking(String timeRange, int limit);
    
    /**
     * 获取区域统计数据
     * @param timeRange 时间范围
     * @return 区域统计数据列表
     */
    List<RegionStatistics> getRegionStatistics(String timeRange);
    
    /**
     * 获取指定区域的详细统计数据
     * @param region 区域名称
     * @param timeRange 时间范围
     * @return 区域统计数据
     */
    RegionStatistics getRegionDetail(String region, String timeRange);
    
    /**
     * 获取区域回收趋势数据
     * @param region 区域名称
     * @param timeRange 时间范围
     * @return 趋势图数据
     */
    ChartData getRegionTrend(String region, String timeRange);
    
    Map<String, Object> getOverallStats();
    
    Map<String, Object> getTrendData(int days);
    
    /**
     * 获取总体统计数据
     * @return 包含总重量和总收入的Map
     */
    Map<String, Object> getTotalStatistics();
    
    /**
     * 获取订单趋势数据
     * @param months 需要获取的月份数
     * @return 订单趋势数据列表
     */
    List<Map<String, Object>> getOrderTrend(int months);
    
    /**
     * 获取物品分布数据
     * @return 物品分布数据列表
     */
    List<Map<String, Object>> getItemDistribution();
    
    /**
     * 获取每日统计数据
     * @return 每日统计数据
     */
    Map<String, Object> getDailyStatistics();
    
    /**
     * 获取月度统计数据
     * @return 月度统计数据
     */
    Map<String, Object> getMonthlyStatistics();
    
    /**
     * 获取统计数据
     */
    StatisticsData getStatisticsData(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取订单统计
     */
    StatisticsData.OrderStatistics getOrderStatistics(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取回收员统计
     */
    StatisticsData.CollectorStatistics getCollectorStatistics(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取回收站统计
     */
    StatisticsData.StationStatistics getStationStatistics(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取区域统计
     */
    List<StatisticsData.AreaStatistics> getAreaStatistics(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取订单趋势数据
     */
    List<Map<String, Object>> getOrderTrend(LocalDateTime startTime, LocalDateTime endTime, int points);
    
    /**
     * 获取物品分布数据
     */
    List<Map<String, Object>> getItemDistribution(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取回收员排名
     */
    List<Map<String, Object>> getTopCollectors(LocalDateTime startTime, LocalDateTime endTime, int limit);
    
    /**
     * 获取回收站排名
     */
    List<Map<String, Object>> getTopStations(LocalDateTime startTime, LocalDateTime endTime, int limit);
    
    /**
     * 获取区域排名
     */
    List<Map<String, Object>> getTopAreas(LocalDateTime startTime, LocalDateTime endTime, int limit);
    
    /**
     * 导出统计报表
     */
    byte[] exportStatisticsReport(LocalDateTime startTime, LocalDateTime endTime);
} 